import { reqLogin, reqGetUserInfo, reqGetUserDetailById } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'

const state = {
  // 1. token (先从本地获取token, 没有则为空)
  token: getToken() || '',
  // 2. 用户信息
  userInfo: {}
}
const mutations = {
  // 1. 提供一个修改token的mutation => 界面调用: this.$store.commit('user/setToken', 'xxxxx')
  setToken(state, newToken) {
    state.token = newToken
  },
  // 2. 提供一个修改用户信息的mutation
  setUserInfo(state, newUserInfo) {
    state.userInfo = newUserInfo
  },
  // 3. 提供一个清空token的mutation
  removeToken(state) {
    state.token = '' // 仓库
    removeToken() // 本地
  },
  // 4. 提供一个清空用户信息的mutation
  removeUserInfo(state) {
    state.userInfo = ''
  }
}
const actions = {
  // 1. 提供一个登录的action => 界面调用: this.$store.dispatch('user/login', obj)
  async login(context, loginObj) {
    // reqLogin(loginObj).then((res) => {
    //   // console.log(res.data.data)
    //   context.commit('setToken', res.data.data)
    //   // 把token存储到cookie中
    //   setToken(res.data.data)
    // })

    // return new Promise((resolve, reject) => {
    //   reqLogin(loginObj).then((res) => {
    //     context.commit('setToken', res.data)
    //     // 把token存储到cookie中
    //     setToken(res.data)
    //     // 当登录操作成功的时候, 会调用此函数
    //     resolve(res)
    //   }).catch((error) => {
    //     // 当登录操作失败的时候, 会调用此函数
    //     reject(error)
    //   })
    // })

    // -------改造--------
    const res = await reqLogin(loginObj)
    // token存储到仓库
    context.commit('setToken', res.data)
    // token存储到cookie
    setToken(res.data)
    return res
  },
  // 2. 提供一个获取用户信息的action
  async getUserInfo(context) {
    // return new Promise((resolve, reject) => {
    //   reqGetUserInfo().then((res) => {
    //     context.commit('setUserInfo', res.data)
    //     resolve(res.data)
    //   }).catch((error) => {
    //     reject(error)
    //   })
    // })

    // promise 改造成 async/await
    // 注意 async函数执行的结果默认就是一个promise
    // 1. 获取用户信息
    const { data: data1 } = await reqGetUserInfo()
    // 2. 根据用户id获取用户详细信息
    const { data: data2 } = await reqGetUserDetailById(data1.userId)
    // 3. 合并用户数据
    const userInfo = { ...data1, ...data2 }
    // 4. 提交并返回数据
    context.commit('setUserInfo', userInfo)
    // console.log(res)
    return userInfo
  },
  // 3. 提供一个退出登录操作的action
  logout(context) {
    context.commit('removeToken')
    context.commit('removeUserInfo')
  }
}
const getters = {}

export default {
  // 设置命名空间
  namespaced: true,
  state,
  mutations,
  actions,
  getters
}

